/**
 * @apiDefine wechat_msg 微信消息通道
 */
const Base = require('./base')
const fs = require('fs')
module.exports = class extends Base {
  constructor (...args) {
    super(...args)
    this.wg = this.service('message')
  }

  /**
     * ::TODO 根据业务流进行相应操作
     * @api {post} /wechat/msg/queue 消息接受地址
     * @apiDescription 接受所有公众号推送过来的信息
     * @apiVersion 1.0.0
     * @apiGroup wechat_msg
     * @apiPermission admin
     * @apiParam {Object} xmlPost 微信xml内容
     * @apiSuccess {String} Content 业务流返回内容
     */
  async queueAction (...args) {
    let d = this.post('xml')
    const { id } = this.get()
    yy.log.debug(id)
    if (!d) return
    d = await this.wg.getPost(d)
    yy.log.info('==========Wechat MSG===========', d, id)
    if (id) {
      const filePath = `${__dirname}/event/${id}.js`
      if (fs.existsSync(filePath)) {
        yy.log.info(`正在执行脚本:${filePath}`)
        require(filePath)(d)
      } else {
        yy.log.warn(`不存在脚本:${filePath}`)
      }
    }
    /**
         * 测试账号信息
         * appid： wx570bc396a51b8ff8
         * Username： gh_3c884a361561
         */
    if (d && d.ToUserName === 'gh_3c884a361561') {
      // 2、模拟粉丝发送文本消息给专用测试公众号，第三方平台方需根据文本消息的内容进行相应的响应：
      if (d.Content) {
        if (d.Content === 'TESTCOMPONENT_MSG_TYPE_TEXT') {
          return this.reply('TESTCOMPONENT_MSG_TYPE_TEXT_callback')

          // 3、模拟粉丝发送文本消息给专用测试公众号，第三方平台方需在5秒内返回空串表明暂时不回复，然后再立即使用客服消息接口发送消息回复粉丝
        } else if (d.Content.indexOf('QUERY_AUTH_CODE') > -1) {
          this.reply()
          //
          let queryAuthCode = d.Content.split(':')
          queryAuthCode = queryAuthCode[1]
          // 获取 openid 信息
          const wxopen = this.service('open')
          const openData = await wxopen.getApiQueryAuth({ auth_code: queryAuthCode })
          /* let data = {}
          if (open_data && open_data.authorizer_appid) {
            data = await wxopen.getBaseInfo(open_data.authorizer_appid)
          }
          yy.log.debug('getBaseInfo', data) */
          // 发送客户信息
          const custom = this.service('customservice')
          await custom.instance(openData.authorizer_appid)
          const replyString = queryAuthCode + '_from_api'
          await custom.send({
            'touser': d.FromUserName,
            'msgtype': 'text',
            'text': { 'content': replyString }
          })
          return
        }
      }
      // 1、模拟粉丝触发专用测试公众号的事件，并推送事件消息到专用测试公众号，第三方平台方开发者需要提取推送XML信息中的event值，并在5秒内立即返回按照下述要求组装的文本消息给粉丝。
      const MsgType = (d.MsgType === 'event') ? d.Event : d.MsgType
      yy.log.debug(MsgType + 'from_callback')
      return this.reply(MsgType + 'from_callback')
    }
    return this.reply(d.Content)
  }

  /**
     * @api {post} /wechat/msg/index 校验是否可用
     * @apiDescription 微信api校验
     * @apiVersion 1.0.0
     * @apiGroup wechat_msg
     * @apiPermission admin
     * @apiParam {String} echostr 校验码
     * @apiSuccess {String} echostr 返回校验码
     */
  indexAction () {
    const echostr = this.get('echostr')
    this.body = echostr
  }

  reply (content) {
    if (!content) {
      this.body = ''
      return
    }
    this.body = this.wg.reply(content)
  }
}
